package com.inspur.edp.ai.flow.node;

import com.inspur.edp.ai.flow.metadata.AbsNode;
import com.inspur.edp.ai.flow.metadata.Parameter;
import com.inspur.edp.ai.flow.spi.NodeCompiler;
import com.inspur.edp.common.expr.ExpressDSLGeneratorMgr;
import com.inspur.edp.common.expr.ast.ASTContext;
import com.inspur.edp.common.expr.evaluator.EvaluatorService;
import com.inspur.edp.common.expr.evaluator.ExpressEvaluator;
import io.iec.edp.caf.commons.utils.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lizhaorui
 * @date 2025/9/16
 * @description
 */
public class VariableDefNodeCompiler implements NodeCompiler {
    @Override
    public String getKind() {
        return VariableDefNode.KIND;
    }

    @Override
    public Map<String, ExpressEvaluator> compile(ASTContext context, AbsNode absNode) {
        VariableDefNode varibleDefNode = (VariableDefNode) absNode;
        Map<String, ExpressEvaluator> inputParameterMap = new HashMap<>();
        if (varibleDefNode.getOutputParams() != null) {
            for (Parameter parameter : varibleDefNode.getOutputParams()) {
                ExpressEvaluator expressEvaluator = null;
                if (!StringUtils.isEmpty(parameter.getValue())) {
                    expressEvaluator = EvaluatorService.build(context, parameter.getValue());
                } else if (parameter.getValueExpr() != null) {
                    expressEvaluator = EvaluatorService.build(context, parameter.getValueExpr());
                }
                parameter.setValueExprEvaluator(expressEvaluator);

                //处理输入参数的依赖
                String expressText = null;
                if (!StringUtils.isEmpty(parameter.getValue())) {
                    expressText = parameter.getValue();
                } else if (parameter.getValueExpr() != null) {
                    expressText = ExpressDSLGeneratorMgr.generateDsl(context, parameter.getValueExpr());
                }
                if (expressText != null) {
                    EvaluatorService.putDependVars(context, expressText, inputParameterMap);
                }
            }
        }
        return inputParameterMap;
    }
}